/**
 * 
 */
package org.stars.daostars.core.parser;

import java.text.MessageFormat;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.stars.daostars.core.SqlFragment;
import org.stars.daostars.core.SqlQuery;
import org.stars.daostars.sqlmapper.SqlMapper;

/**
 * Classe di utilità. Contiene
 * <ul>
 * <li>checkParenthesis: controlla che il numero di parentesi aperte sia uguale
 * al numero di parentesi chiuse.</li>
 * <li>removeSpaces: rimuove gli spazi</li>
 * </ul>
 * 
 * 
 * @author Francesco Benincasa (908099)
 * 
 */
public abstract class VariablesChecker {

	/**
	 * logger
	 * 
	 * @return logger
	 */
	public static Log getLog() {
		return LogFactory.getLog(VariablesChecker.class);
	}
	
	/**
	 * Data una definizione di dao, il metodo provvedere ad analizzare tutte le
	 * definizioni di query e verifica che le variabili siano presenti nella
	 * definizione del dao
	 * 
	 * @param definition
	 * @return <code>true</code> se non sono trovati errori,
	 *         <code>false</code> altrimenti.
	 * @throws Exception
	 *             in caso di errore.
	 */
	public static boolean checkForVariableBinding(
			SqlMapper definition) throws Exception {
		
		Map<String, SqlQuery> queries = definition.getQuerySet();

		for (SqlQuery query : queries.values()) {
			for (SqlFragment clause : query.getClauses()) {
				for (String variableName : clause.getUsedVariables()) {
					if (!definition.containsVariable(variableName)) {
						String info = MessageFormat
								.format(
										"The variable {0} called in the query {1} in the dao definition {2} does not exist ",
										variableName, query.getName(),
										definition.getName());
						Log log = getLog();
						log.error(info);
					}
				}
			}
		}
		return true;
	}
	
	

}
